/*
 * FSWUniCEUB - 2008
 * 
 * Este arquivo é de propriedade da Fábrica de Software do UniCEUB
 * 
 * Para mais informações entre em contato com a coordenação do
 * curso de Ciência da Computação da instituição.
 */

package br.uniceub.fsw.util;

import java.util.Collections;
import java.util.Enumeration;
import java.util.HashMap;
import java.util.Map;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletRequestWrapper;

/**
 * Http request com a possibilidade de alterar os valores dos parâmetros.
 * 
 * @author Bruno Schifer Bernardi
 */
public class HttpRequestWithModifiableParameters extends HttpServletRequestWrapper {
    Map params;
    
    /**
     * Construtor da classe.
     * 
     * @param request Requisicão Http.
     */
    public HttpRequestWithModifiableParameters(HttpServletRequest request) {
        super(request);
        this.params = new HashMap(request.getParameterMap());
    }
    
    /* {non-Javadoc}
     * @see javax.servlet.ServletRequest#getParameter(java.lang.String)
     */
    @Override
    public String getParameter(String name) {
        String returnValue = null;
        String[] paramArray = getParameterValues(name);
        if(paramArray != null && paramArray.length > 0)
        {
            returnValue = paramArray[0];
        }
        return returnValue;
    }
    
    /* {non-Javadoc}
     * @see javax.servlet.ServletRequest#getParameterMap(java.lang.String)
     */
    @Override
    public Map getParameterMap() {
        return Collections.unmodifiableMap(params);
    }
    
    /* {non-Javadoc}
     * @see javax.servlet.ServletRequest#getParameterNames()
     */
    @Override
    public Enumeration getParameterNames() {
        return Collections.enumeration(params.keySet());
    }
    
    /* {non-Javadoc}
     * @see javax.servlet.ServletRequest#getParameterValues()
     */
    @Override
    public String[] getParameterValues(String name) {
        String[] result = null;
        String[] temp = (String[])params.get(name);
        if(temp != null) {
            result = new String[temp.length];
            System.arraycopy(temp, 0, result, 0, temp.length);
        }
        return result;
    }
    
    /**
     * Sets a single value for the parameter. Overwrites any current values.
     * 
     * @param name Name of the parameter to set.
     * @param value Value of the parameter.
     */
    public void setParameter(String name, String value) {
        String[] oneParam = {value};
        setParameter(name, oneParam);
    }
    
    /**
     * Sets multiple values for a parameter. Overwrites any current values.
     * 
     * @param name Name of the parameter to set.
     * @param values String[] of values.
     */
    public void setParameter(String name, String[] values) {
        params.put(name, values);
    }
    
}
